/*弹出层*/

/*
	参数解释：
	title	标题
	url		请求的url
	id		需要操作的数据id
	w		弹出层宽度（缺省调默认值）
	h		弹出层高度（缺省调默认值）
*/
function layer_show(title, url, w, h) {
    if (title == null || title == '') {
        title = false;
    }
    ;
    if (url == null || url == '') {
        url = "404.html";
    }
    ;
    if (w == null || w == '') {
        w = 800;
    }
    ;
    if (h == null || h == '') {
        h = ($(window).height() - 50);
    }
    ;
    layer.open({
        type: 2,
        area: [w + 'px', h + 'px'],
        fix: false, //不固定
        maxmin: true,
        shade: 0.4,
        title: title,
        content: url
    });
}

/** 显示长时间提示，参数msg为要显示的内容，默认5秒后消失 */
function showLongMsg(msg) {
    showMsg(msg, {time: 5000});
}

/** 显示普通消息 */
function showMsg(msg, config) {
    if (typeof config == "number") config = {time: config};
    layer.msg(msg, config);
}

/** 显示成功消息 */
function successMsg(msg) {
    showMsg(msg, {icon: 1, time: 2000});
}

/** 显示失败消息 */
function failMsg(msg) {
    showMsg(msg, {icon: 2, time: 2000});
}

/** layui 确认窗口 **/
function layui_comfirm(title, funCalback) {
    layer.open({
        content: title + '?'
        , btn: ['确认', '取消']
        , yes: function (index, layero) {
            funCalback();
        }
        , btn2: function (index, layero) {
            //按钮【按钮二】的回调
            //return false 开启该代码可禁止点击该按钮关闭
        }
        , cancel: function () {
            //右上角关闭回调
            //return false 开启该代码可禁止点击该按钮关闭
        }
    });
}

/*关闭弹出框口 table里点开的窗口，关闭并刷新table*/
function table_layer_close() {
    /*setTimeout(function () {

    }, 2000)*/
    var index = parent.layer.getFrameIndex(window.name);
    parent.layer.close(index);
    //修改成功后刷新父界面
    window.parent.location.reload();
}

/*关闭弹出框口 仅关闭*/
function layer_close() {
    var index = parent.layer.getFrameIndex(window.name);
    parent.layer.close(index);
}

function IsURL(strRegex, str) {
    var re = new RegExp(strRegex);
    if (re.test(str)) {
        return true;
    } else {
        return false;
    }
}

/**
 * 用这个方法 配合 r.Response.WriteJson(re) 渲染json
 * @param _url
 * @param data
 * @param callBack
 */
function ajaxPostNoAsyncJson(_url, data, callBack) {
    $.ajax({
        type: "post",
        url: _url,
        data: data,
        dataType: 'json',
        async: false,
        success: function (data) {
            if (data) {
                if (callBack) {
                    callBack(data);
                }
            }

        },
        error: function (XMLHttpRequest, textStatus, errorThrown) {
            console.log(errorThrown);
        }
    });
}

function ajaxPostNoAsync(_url, data, callBack) {
    $.ajax({
        type: "post",
        url: _url,
        data: data,
        dataType: "text",
        async: false,
        success: function (data) {
            if (data) {
                if (callBack) {
                    callBack(data);
                }
            }

        },
        error: function (XMLHttpRequest, textStatus, errorThrown) {
            console.log(errorThrown);
        }
    });
}

function ajaxSubmit(formId, callback, nowait) {
    var index;
    if (!nowait) {
        index = layer.load();
    }

    $('#' + formId).ajaxSubmit({
        dataType: 'json',
        iframe: false,
        success: function (dataMsg) {
            if (index) {
                layer.close(index);
            }
            if (callback) {
                callback(dataMsg);
            }
        }
    });
}

/**
 * Validates a cron expression.
 *
 * @param cronExpression The expression to validate
 * @return True is expression is valid
 */
function cronValidate(cronExpression) {
    //alert("校验函数的开始！");
    var cronParams = cronExpression.split(" ");

    if (cronParams.length < 6 || cronParams.length > 7) {
        return false;
    }

    //CronTrigger cronTrigger = new CronTrigger();
    //cronTrigger.setCronExpression( cronExpression );

    if (cronParams[3] == "?" || cronParams[5] == "?") {
        //Check seconds param
        if (!checkSecondsField(cronParams[0])) {
            return false;
        }

        //Check minutes param
        if (!checkMinutesField(cronParams[1])) {
            return false;
        }

        //Check hours param
        if (!checkHoursField(cronParams[2])) {
            return false;
        }

        //Check day-of-month param
        if (!checkDayOfMonthField(cronParams[3])) {
            return false;
        }

        //Check months param
        if (!checkMonthsField(cronParams[4])) {
            return false;
        }

        //Check day-of-week param
        if (!checkDayOfWeekField(cronParams[5])) {
            return false;
        }

        //Check year param
        if (cronParams.length == 7) {
            if (!checkYearField(cronParams[6])) {
                return false;
            }
        }

        return true;
    } else {
        return false;
    }
}

function checkSecondsField(secondsField) {
    return checkField(secondsField, 0, 59);
}


function checkField(secondsField, minimal, maximal) {
    if (secondsField.indexOf("-") > -1) {
        var startValue = secondsField.substring(0, secondsField.indexOf("-"));
        var endValue = secondsField.substring(secondsField.indexOf("-") + 1);

        if (!(checkIntValue(startValue, minimal, maximal, true) && checkIntValue(endValue, minimal, maximal, true))) {
            return false;
        }
        try {
            var startVal = parseInt(startValue, 10);
            var endVal = parseInt(endValue, 10);

            return endVal > startVal;
        } catch (e) {
            return false;
        }
    } else if (secondsField.indexOf(",") > -1) {
        return checkListField(secondsField, minimal, maximal);
    } else if (secondsField.indexOf("/") > -1) {
        return checkIncrementField(secondsField, minimal, maximal);
    } else if (secondsField.indexOf("*") != -1) {
        return true;
    } else {
        return checkIntValue(secondsField, minimal, maximal);
    }
}

function checkIntValue(value, minimal, maximal, checkExtremity) {
    try {
        var val = parseInt(value, 10);
        //判断是否为整数
        if (value == val) {
            if (checkExtremity) {
                if (val < minimal || val > maximal) {
                    return false;
                }
            }

            return true;
        }

        return false;
    } catch (e) {
        return false;
    }
}

function checkMinutesField(minutesField) {
    return checkField(minutesField, 0, 59);
}

function checkHoursField(hoursField) {
    return checkField(hoursField, 0, 23);
}

function checkDayOfMonthField(dayOfMonthField) {
    if (dayOfMonthField == "?") {
        return true;
    }

    if (dayOfMonthField.indexOf("L") >= 0) {
        return checkFieldWithLetter(dayOfMonthField, "L", 1, 7, -1, -1);
    } else if (dayOfMonthField.indexOf("W") >= 0) {
        return checkFieldWithLetter(dayOfMonthField, "W", 1, 31, -1, -1);
    } else if (dayOfMonthField.indexOf("C") >= 0) {
        return checkFieldWithLetter(dayOfMonthField, "C", 1, 31, -1, -1);
    } else {
        return checkField(dayOfMonthField, 1, 31);
    }
}


function checkMonthsField(monthsField) {
    /*        monthsField = StringUtils.replace( monthsField, "JAN", "1" );
            monthsField = StringUtils.replace( monthsField, "FEB", "2" );
            monthsField = StringUtils.replace( monthsField, "MAR", "3" );
            monthsField = StringUtils.replace( monthsField, "APR", "4" );
            monthsField = StringUtils.replace( monthsField, "MAY", "5" );
            monthsField = StringUtils.replace( monthsField, "JUN", "6" );
            monthsField = StringUtils.replace( monthsField, "JUL", "7" );
            monthsField = StringUtils.replace( monthsField, "AUG", "8" );
            monthsField = StringUtils.replace( monthsField, "SEP", "9" );
            monthsField = StringUtils.replace( monthsField, "OCT", "10" );
            monthsField = StringUtils.replace( monthsField, "NOV", "11" );
            monthsField = StringUtils.replace( monthsField, "DEC", "12" );*/

    monthsField.replace("JAN", "1");
    monthsField.replace("FEB", "2");
    monthsField.replace("MAR", "3");
    monthsField.replace("APR", "4");
    monthsField.replace("MAY", "5");
    monthsField.replace("JUN", "6");
    monthsField.replace("JUL", "7");
    monthsField.replace("AUG", "8");
    monthsField.replace("SEP", "9");
    monthsField.replace("OCT", "10");
    monthsField.replace("NOV", "11");
    monthsField.replace("DEC", "12");

    return checkField(monthsField, 1, 31);
}

function checkDayOfWeekField(dayOfWeekField) {
    /*        dayOfWeekField = StringUtils.replace( dayOfWeekField, "SUN", "1" );
            dayOfWeekField = StringUtils.replace( dayOfWeekField, "MON", "2" );
            dayOfWeekField = StringUtils.replace( dayOfWeekField, "TUE", "3" );
            dayOfWeekField = StringUtils.replace( dayOfWeekField, "WED", "4" );
            dayOfWeekField = StringUtils.replace( dayOfWeekField, "THU", "5" );
            dayOfWeekField = StringUtils.replace( dayOfWeekField, "FRI", "6" );
            dayOfWeekField = StringUtils.replace( dayOfWeekField, "SAT", "7" );*/

    dayOfWeekField.replace("SUN", "1");
    dayOfWeekField.replace("MON", "2");
    dayOfWeekField.replace("TUE", "3");
    dayOfWeekField.replace("WED", "4");
    dayOfWeekField.replace("THU", "5");
    dayOfWeekField.replace("FRI", "6");
    dayOfWeekField.replace("SAT", "7");

    if (dayOfWeekField == "?") {
        return true;
    }

    if (dayOfWeekField.indexOf("L") >= 0) {
        return checkFieldWithLetter(dayOfWeekField, "L", 1, 7, -1, -1);
    } else if (dayOfWeekField.indexOf("C") >= 0) {
        return checkFieldWithLetter(dayOfWeekField, "C", 1, 7, -1, -1);
    } else if (dayOfWeekField.indexOf("#") >= 0) {
        return checkFieldWithLetter(dayOfWeekField, "#", 1, 7, 1, 5);
    } else {
        return checkField(dayOfWeekField, 1, 7);
    }
}

function checkYearField(yearField) {
    return checkField(yearField, 1970, 2099);
}


function checkFieldWithLetter(value, letter, minimalBefore, maximalBefore,
                              minimalAfter, maximalAfter) {
    var canBeAlone = false;
    var canHaveIntBefore = false;
    var canHaveIntAfter = false;
    var mustHaveIntBefore = false;
    var mustHaveIntAfter = false;

    if (letter == "L") {
        canBeAlone = true;
        canHaveIntBefore = true;
        canHaveIntAfter = false;
        mustHaveIntBefore = false;
        mustHaveIntAfter = false;
    }
    if (letter == "W" || letter == "C") {
        canBeAlone = false;
        canHaveIntBefore = true;
        canHaveIntAfter = false;
        mustHaveIntBefore = true;
        mustHaveIntAfter = false;
    }
    if (letter == "#") {
        canBeAlone = false;
        canHaveIntBefore = true;
        canHaveIntAfter = true;
        mustHaveIntBefore = true;
        mustHaveIntAfter = true;
    }

    var beforeLetter = "";
    var afterLetter = "";

    if (value.indexOf(letter) >= 0) {
        beforeLetter = value.substring(0, value.indexOf(letter));
    }

    if (!value.endsWith(letter)) {
        afterLetter = value.substring(value.indexOf(letter) + 1);
    }

    if (value.indexOf(letter) >= 0) {
        if (letter == value) {
            return canBeAlone;
        }

        if (canHaveIntBefore) {
            if (mustHaveIntBefore && beforeLetter.length == 0) {
                return false;
            }

            if (!checkIntValue(beforeLetter, minimalBefore, maximalBefore, true)) {
                return false;
            }
        } else {
            if (beforeLetter.length > 0) {
                return false;
            }
        }

        if (canHaveIntAfter) {
            if (mustHaveIntAfter && afterLetter.length == 0) {
                return false;
            }

            if (!checkIntValue(afterLetter, minimalAfter, maximalAfter, true)) {
                return false;
            }
        } else {
            if (afterLetter.length > 0) {
                return false;
            }
        }
    }

    return true;
}

/*    function checkIntValue(value, minimal, maximal) {
        return checkIntValue(value, minimal, maximal, true);
    } */

function checkIncrementField(value, minimal, maximal) {
    var start = value.substring(0, value.indexOf("/"));

    var increment = value.substring(value.indexOf("/") + 1);

    if (!("*" == start)) {
        return checkIntValue(start, minimal, maximal, true) && checkIntValue(increment, minimal, maximal, false);
    } else {
        return checkIntValue(increment, minimal, maximal, true);
    }
}


function checkListField(value, minimal, maximal) {
    var st = value.split(",");

    var values = new Array(st.length);

    for (var j = 0; j < st.length; j++) {
        values[j] = st[j];
    }

    var previousValue = -1;

    for (var i = 0; i < values.length; i++) {
        var currentValue = values[i];

        if (!checkIntValue(currentValue, minimal, maximal, true)) {
            return false;
        }

        try {
            var val = parseInt(currentValue, 10);

            if (val <= previousValue) {
                return false;
            } else {
                previousValue = val;
            }
        } catch (e) {
            // we have always an int
        }
    }

    return true;
}